<!DOCTYPE html>
<html>
<head>
	<!-- Global site tag (gtag.js) - Google Analytics -->
	<script async src="https://www.googletagmanager.com/gtag/js?id='UA-133422980-2"></script>
	<script>
	  window.dataLayer = window.dataLayer || [];
	  function gtag(){dataLayer.push(arguments);}
	  gtag('js', new Date());

	  gtag('config', 'UA-133422980-2');
	</script>

	<meta charset="utf-8">
	<meta http-equiv="x-ua-compatible" content="ie=edge">
	<meta name="viewport" content="width=device-width, initial-scale=1">

	<title>
		gem5: Interconnection network 
	</title>

	<!-- SITE FAVICON -->
	<link rel="shortcut icon" type="image/gif" href="/assets/img/gem5ColorVert.gif"/>

	<link rel="canonical" href="http://localhost:4000/documentation/general_docs/ruby/interconnection-network/">
	<link href='https://fonts.googleapis.com/css?family=Open+Sans:400,300,700,800,600' rel='stylesheet' type='text/css'>
	<link href='https://fonts.googleapis.com/css?family=Muli:400,300' rel='stylesheet' type='text/css'>

	<!-- FAVICON -->
	<link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css">

	<!-- BOOTSTRAP -->
	<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin="anonymous">

	<!-- CUSTOM CSS -->
	<link rel="stylesheet" href="/css/main.css">
</head>


<body>
	<nav class="navbar navbar-expand-md navbar-light bg-light">
  <a class="navbar-brand" href="/">
		<img src="/assets/img/gem5ColorLong.gif" alt="gem5" height=55px>
	</a>
  <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNavDropdown" aria-controls="navbarNavDropdown" aria-expanded="false" aria-label="Toggle navigation">
    <span class="navbar-toggler-icon"></span>
  </button>
  <div class="collapse navbar-collapse" id="navbarNavDropdown">
    <!-- LIST FOR NAVBAR -->
    <ul class="navbar-nav ml-auto">
      <!-- HOME -->
      <li class="nav-item ">
        <a class="nav-link" href="/">Home</a>
      </li>

      <!-- ABOUT -->
			<li class="nav-item dropdown ">
				<a class="nav-link dropdown-toggle" id="navbarDropdownMenuLink" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
					About
				</a>
				<div class="dropdown-menu" aria-labelledby="navbarDropdownMenuLink">
          <a class="dropdown-item" href="/about">About gem5</a>
          <a class="dropdown-item" href="/publications">Publications</a>
          <a class="dropdown-item" href="/governance">Governance</a>
				</div>
			</li>

      <!-- DOCUMENTATION -->
			<li class="nav-item dropdown active">
				<a class="nav-link dropdown-toggle" id="navbarDropdownMenuLink" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
					Documentation
				</a>
				<div class="dropdown-menu" aria-labelledby="navbarDropdownMenuLink">
					<!-- Pull navigation from _data/documentation.yml -->
					
            <a class="dropdown-item" href="/documentation">gem5 documentation</a>
					
            <a class="dropdown-item" href="/documentation/learning_gem5/introduction">Learning gem5</a>
					
            <a class="dropdown-item" href="http://doxygen.gem5.org/release/current/index.html">gem5 Doxygen</a>
					
            <a class="dropdown-item" href="/documentation/reporting_problems">Reporting Problems</a>
					
				</div>
			</li>

      <!-- EVENTS -->
			<li class="nav-item dropdown ">
        <a class="nav-link" href="/events/">Events</a>
			</li>

      <!-- CONTRIBUTING -->
      <li class="nav-item ">
        <a class="nav-link" href="/contributing">Contributing</a>
      </li>

      <!-- BLOG -->
      <li class="nav-item ">
        <a class="nav-link" href="/blog">Blog</a>
      </li>

      <!-- SEARCH -->
			<li class="nav-item ">
        <a class="nav-link" href="/search">Search</a>
      </li>
    </ul>
  </div>
</nav>

	<main>
		<div class="sidenav-top">
  <div class="sidenav-brand bg-light">
    <a href="/"><img src="/assets/img/gem5ColorLong.gif" height="55px"></a>
  </div>
  <div class="search">
    <form action="/search" method="get">
      <!-- <label for="search-box"><i class="fa fa-search"></i></label> -->
      <input type="text" name="query">
      <button type="submit" name="submit"><i class="fa fa-search"></i></button>
    </form>
  </div>
</div>
<div class="sidenav">
  <!-- Pull navigation from _data/documentation.yml -->
  
    
    
      <a class="item" href="/documentation" role="button" aria-expanded="false" aria-controls="collapseExample">
        gem5 documentation
      </a>
      <div class="collapse " id="gem5_documentation">
        
      </div>
    
      <a class="item" href="/documentation/general_docs/development/coding_style/" role="button" aria-expanded="false" aria-controls="collapseExample">
        Code Style
      </a>
      <div class="collapse " id="code_style">
        
      </div>
    
      <a class="item" data-toggle="collapse" href="#building" role="button" aria-expanded="false" aria-controls="collapseExample">
        Building
      </a>
      <div class="collapse " id="building">
        
          <a class="subitem " href="/documentation/general_docs/building">Building</a>
        
          <a class="subitem " href="/documentation/general_docs/building/EXTRAS">Building EXTRAS</a>
        
      </div>
    
      <a class="item" data-toggle="collapse" href="#doxygen-docs" role="button" aria-expanded="false" aria-controls="collapseExample">
        Doxygen
      </a>
      <div class="collapse " id="doxygen-docs">
        
          <a class="subitem " href="http://doxygen.gem5.org/develop/index.html">Develop Branch</a>
        
          <a class="subitem " href="http://doxygen.gem5.org/release/v19-0-0-0/index.html">v19.0.0.0</a>
        
      </div>
    
      <a class="item" data-toggle="collapse" href="#fullsystem" role="button" aria-expanded="false" aria-controls="collapseExample">
        Full System
      </a>
      <div class="collapse " id="fullsystem">
        
          <a class="subitem " href="/documentation/general_docs/fullsystem/disks">Creating Disk Images</a>
        
          <a class="subitem " href="/documentation/general_docs/fullsystem/devices">Devices</a>
        
          <a class="subitem " href="/documentation/general_docs/fullsystem/m5term">m5term</a>
        
          <a class="subitem " href="/documentation/general_docs/fullsystem/building_arm_kernel">Building Linux ARM Kernel</a>
        
          <a class="subitem " href="/documentation/general_docs/fullsystem/building_android_m">Building Android Marshmallow</a>
        
          <a class="subitem " href="/documentation/general_docs/fullsystem/guest_binaries">Guest binaries</a>
        
      </div>
    
      <a class="item" data-toggle="collapse" href="#memory_system" role="button" aria-expanded="false" aria-controls="collapseExample">
        Memory System
      </a>
      <div class="collapse " id="memory_system">
        
          <a class="subitem " href="/documentation/general_docs/memory_system/">Memory System</a>
        
          <a class="subitem " href="/documentation/general_docs/memory_system/gem5_memory_system">gem5 Memory System</a>
        
          <a class="subitem " href="/documentation/general_docs/memory_system/replacement_policies">Replacement Policies</a>
        
          <a class="subitem " href="/documentation/general_docs/memory_system/indexing_policies">Indexing Policies</a>
        
          <a class="subitem " href="/documentation/general_docs/memory_system/classic-coherence-protocol">Classic memory system coherence</a>
        
          <a class="subitem " href="/documentation/general_docs/memory_system/classic_caches">Classic caches</a>
        
      </div>
    
      <a class="item" data-toggle="collapse" href="#ruby" role="button" aria-expanded="false" aria-controls="collapseExample">
        Ruby Memory System
      </a>
      <div class="collapse show" id="ruby">
        
          <a class="subitem " href="/documentation/general_docs/ruby">Ruby</a>
        
          <a class="subitem " href="/documentation/general_docs/ruby/cache-coherence-protocols">Cache Coherence Protocols</a>
        
          <a class="subitem " href="/documentation/general_docs/ruby/garnet-2">Garnet 2.0</a>
        
          <a class="subitem " href="/documentation/general_docs/ruby/MOESI_CMP_directory">MOESI CMP directory</a>
        
          <a class="subitem " href="/documentation/general_docs/ruby/garnet_synthetic_traffic">Garnet Synthetic Traffic</a>
        
          <a class="subitem " href="/documentation/general_docs/ruby/slicc">SLICC</a>
        
          <a class="subitem " href="/documentation/general_docs/ruby/MI_example">MI example</a>
        
          <a class="subitem " href="/documentation/general_docs/ruby/Garnet_standalone">Garnet standalone</a>
        
          <a class="subitem active" href="/documentation/general_docs/ruby/interconnection-network">Interconnection network</a>
        
          <a class="subitem " href="/documentation/general_docs/ruby/MOESI_hammer">MOESI hammer</a>
        
          <a class="subitem " href="/documentation/general_docs/ruby/MOESI_CMP_token">MOESI CMP token</a>
        
          <a class="subitem " href="/documentation/general_docs/ruby/MESI_Two_Level">MESI two level</a>
        
          <a class="subitem " href="/documentation/general_docs/memory_system/replacement_policies">Replacement Policies</a>
        
      </div>
    
      <a class="item" data-toggle="collapse" href="#cpu_models" role="button" aria-expanded="false" aria-controls="collapseExample">
        CPU Models
      </a>
      <div class="collapse " id="cpu_models">
        
          <a class="subitem " href="/documentation/general_docs/cpu_models/SimpleCPU">SimpleCPU</a>
        
          <a class="subitem " href="/documentation/general_docs/cpu_models/O3CPU">O3CPU</a>
        
          <a class="subitem " href="/documentation/general_docs/cpu_models/TraceCPU">TraceCPU</a>
        
          <a class="subitem " href="/documentation/general_docs/cpu_models/minor_cpu">Minor CPU Model</a>
        
          <a class="subitem " href="/documentation/general_docs/cpu_models/execution_basics">Execution Basics</a>
        
          <a class="subitem " href="/documentation/general_docs/cpu_models/visualization">Visualization</a>
        
      </div>
    
      <a class="item" href="/documentation/general_docs/m5ops" role="button" aria-expanded="false" aria-controls="collapseExample">
        M5ops
      </a>
      <div class="collapse " id="m5ops">
        
      </div>
    
      <a class="item" href="/documentation/general_docs/checkpoints" role="button" aria-expanded="false" aria-controls="collapseExample">
        Checkpoints
      </a>
      <div class="collapse " id="checkpoints">
        
      </div>
    
      <a class="item" data-toggle="collapse" href="#directed_testers" role="button" aria-expanded="false" aria-controls="collapseExample">
        Directed Testers
      </a>
      <div class="collapse " id="directed_testers">
        
          <a class="subitem " href="/documentation/general_docs/debugging_and_testing/directed_testers/garnet_synthetic_traffic">Garnet Synthetic Traffic</a>
        
          <a class="subitem " href="/documentation/general_docs/debugging_and_testing/directed_testers/ruby_random_tester">Ruby Random Tester</a>
        
      </div>
    
      <a class="item" data-toggle="collapse" href="#debugging" role="button" aria-expanded="false" aria-controls="collapseExample">
        Debugging
      </a>
      <div class="collapse " id="debugging">
        
          <a class="subitem " href="/documentation/general_docs/debugging_and_testing/debugging/trace_based_debugging">Trace-based Debugging</a>
        
          <a class="subitem " href="/documentation/general_docs/debugging_and_testing/debugging/debugger_based_debugging">Debugger-based Debugging</a>
        
          <a class="subitem " href="/documentation/general_docs/debugging_and_testing/debugging/debugging_simulated_code">Debugging Simulated Code</a>
        
          <a class="subitem " href="/documentation/reporting_problems">Reporting Problems</a>
        
      </div>
    
      <a class="item" data-toggle="collapse" href="#architecture_support" role="button" aria-expanded="false" aria-controls="collapseExample">
        Architecture Support
      </a>
      <div class="collapse " id="architecture_support">
        
          <a class="subitem " href="/documentation/general_docs/architecture_support/">Architecture Support</a>
        
          <a class="subitem " href="/documentation/general_docs/architecture_support/arm_implementation/">ARM Implementation</a>
        
          <a class="subitem " href="/documentation/general_docs/architecture_support/isa_parser/">ISA Parser</a>
        
          <a class="subitem " href="/documentation/general_docs/architecture_support/x86_microop_isa/">X86 microop ISA</a>
        
      </div>
    
      <a class="item" href="/documentation/general_docs/thermal_model" role="button" aria-expanded="false" aria-controls="collapseExample">
        Power and Thermal Model
      </a>
      <div class="collapse " id="">
        
      </div>
    
      <a class="item" href="/documentation/general_docs/compiling_workloads/" role="button" aria-expanded="false" aria-controls="collapseExample">
        Compiling Workloads
      </a>
      <div class="collapse " id="compiling_workloads">
        
      </div>
    
      <a class="item" href="/documentation/general_docs/statistics/" role="button" aria-expanded="false" aria-controls="collapseExample">
        Stats Package
      </a>
      <div class="collapse " id="statistics">
        
      </div>
    
    
  
    
  
    
  
    
  
</div>


<div class="container" id="doc-container">
  <div class="edit"><a href="https://gem5.googlesource.com/public/gem5-website/+/refs/heads/master/README.md">Edit this page</a></div>
  <b>authors:</b> Jason Lowe-Power<br>
  

  <br>
  <h1 id="interconnection-network">Interconnection Network</h1>

<p>The various components of the interconnection network model inside
gem5’s ruby memory system are described here.</p>

<h2 id="how-to-invoke-the-network">How to invoke the network</h2>

<p><strong>Simple Network</strong>:</p>

<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>./build/ALPHA/gem5.debug \
                      configs/example/ruby_random_test.py \
                      --num-cpus=16  \
                      --num-dirs=16  \
                      --network=simple
                      --topology=Mesh_XY  \
                      --mesh-rows=4
</code></pre></div></div>

<p>The default network is simple, and the default topology is crossbar.</p>

<p><strong>Garnet network</strong>:</p>

<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>./build/ALPHA/gem5.debug \
                      configs/example/ruby_random_test.py  \
                      --num-cpus=16 \
                      --num-dirs=16  \
                      --network=garnet2.0 \
                      --topology=Mesh_XY \
                      --mesh-rows=4
</code></pre></div></div>

<h2 id="topology">Topology</h2>

<p>The connection between the various controllers are specified via python
files. All external links (between the controllers and routers) are
bi-directional. All internal links (between routers) are uni-directional
– this allows a per-direction weight on each link to bias routing
decisions.</p>

<ul>
  <li><strong>Related Files</strong>:
    <ul>
      <li><strong>src/mem/ruby/network/topologies/Crossbar.py</strong></li>
      <li><strong>src/mem/ruby/network/topologies/CrossbarGarnet.py</strong></li>
      <li><strong>src/mem/ruby/network/topologies/Mesh_XY.py</strong></li>
      <li><strong>src/mem/ruby/network/topologies/Mesh_westfirst.py</strong></li>
      <li><strong>src/mem/ruby/network/topologies/MeshDirCorners_XY.py</strong></li>
      <li><strong>src/mem/ruby/network/topologies/Pt2Pt.py</strong></li>
      <li><strong>src/mem/ruby/network/Network.py</strong></li>
      <li><strong>src/mem/ruby/network/BasicLink.py</strong></li>
      <li><strong>src/mem/ruby/network/BasicRouter.py</strong></li>
    </ul>
  </li>
  <li><strong>Topology Descriptions</strong>:
    <ul>
      <li><strong>Crossbar</strong>: Each controller (L1/L2/Directory) is connected to
a simple switch. Each switch is connected to a central switch
(modeling the crossbar). This can be invoked from command line
by <strong>–topology=Crossbar</strong>.</li>
      <li><strong>CrossbarGarnet</strong>: Each controller (L1/L2/Directory) is
connected to every other controller via one garnet router (which
internally models the crossbar and allocator). This can be
invoked from command line by <strong>–topology=CrossbarGarnet</strong>.</li>
      <li><strong>Mesh_*</strong>: This topology requires the number of directories
to be equal to the number of cpus. The number of
routers/switches is equal to the number of cpus in the system.
Each router/switch is connected to one L1, one L2 (if present),
and one Directory. The number of rows in the mesh <strong>has to be
specified</strong> by <strong>–mesh-rows</strong>. This parameter enables the
creation of non-symmetrical meshes too.
        <ul>
          <li><strong>Mesh_XY</strong>: Mesh with XY routing. All x-directional links
are biased with a weight of 1, while all y-directional links
are biased with a weight of 2. This forces all messages to
use X-links first, before using Y-links. It can be invoked
from command line by <strong>–topology=Mesh_XY</strong></li>
          <li><strong>Mesh_westfirst</strong>: Mesh with west-first routing. All
west-directional links are biased with a weight of 1, al
other links are biased with a weight of 2. This forces all
messages to use west-directional links first, before using
other links. It can be invoked from command line by
<strong>–topology=Mesh_westfirst</strong></li>
        </ul>
      </li>
      <li><strong>MeshDirCorners_XY</strong>: This topology requires the number of
directories to be equal to 4. number of routers/switches is
equal to the number of cpus in the system. Each router/switch is
connected to one L1, one L2 (if present). Each corner
router/switch is connected to one Directory. It can be invoked
from command line by <strong>–topology=MeshDirCorners_XY</strong>. The
number of rows in the mesh <strong>has to be specified</strong> by
<strong>–mesh-rows</strong>. The XY routing algorithm is used.</li>
      <li><strong>Pt2Pt</strong>: Each controller (L1/L2/Directory) is connected to
every other controller via a direct link. This can be invoked
from command line by</li>
      <li><strong>Pt2Pt</strong>: All to all point-to-point connection</li>
    </ul>
  </li>
</ul>

<p><img src="http://pwp.gatech.edu/ece-synergy/wp-content/uploads/sites/332/2016/10/topologies.jpg" alt="" /></p>

<p><strong>In each topology, each link and each router can independently be
passed a parameter that overrides the defaults (in BasicLink.py and
BasicRouter.py)</strong>:</p>

<ul>
  <li><strong>Link Parameters:</strong>
    <ul>
      <li><strong>latency</strong>: latency of traversal within the link.</li>
      <li><strong>weight</strong>: weight associated with this link. This parameter is
used by the routing table while deciding routes, as explained
next in <a href="Interconnection_Network#Routing" title="wikilink">Routing</a>.</li>
      <li><strong>bandwidth_factor</strong>: Only used by simple network to specify
width of the link in bytes. This translates to a bandwidth
multiplier (simple/SimpleLink.cc) and the individual link
bandwidth becomes bandwidth multiplier x endpoint_bandwidth
(specified in SimpleNetwork.py). In garnet, the bandwidth is
specified by ni_flit_size in GarnetNetwork.py)</li>
    </ul>
  </li>
  <li><strong>Internal Link Parameters:</strong>
    <ul>
      <li><strong>src_outport</strong>: String with name for output port from source
router.</li>
      <li><strong>dst_inport</strong>: String with name for input port at destination
router.</li>
    </ul>
  </li>
</ul>

<p>These two parameters can be used by routers to implement custom routing
algorithms in garnet2.0</p>

<ul>
  <li><strong>Router Parameters:</strong>
    <ul>
      <li><strong>latency</strong>: latency of each router. Only supported by
garnet2.0.</li>
    </ul>
  </li>
</ul>

<h2 id="routing">Routing</h2>

<p><strong>Table-based Routing (Default):</strong> Based on the topology, shortest
path graph traversals are used to populate <em>routing tables</em> at each
router/switch. This is done in src/mem/ruby/network/Topology.cc The
default routing algorithm is table-based and tries to choose the route
with minimum number of link traversals. Links can be given weights in
the topology files to model different routing algorithms. For example,
in Mesh_XY.py and MeshDirCorners_XY.py Y-direction links are given
weights of 2, while X-direction links are given weights of 1, resulting
in XY traversals. In Mesh_westfirst.py, the west-links are given
weights of 1, and all other links are given weights of 2. In garnet2.0,
the routing algorithm randomly chooses between links with equal weights.
In simple network, it statically chooses between links with equal
weights.</p>

<p><strong>Custom Routing algorithms:</strong> In garnet2.0, we provide additional
support to implement custom (including adaptive) routing algorithms (See
outportComputeXY() in src/mem/ruby/network/garnet2.0/RoutingUnit.cc).
The src_outport and dst_inport fields of the links can be used to give
custom names to each link (e.g., directions if a mesh), and these can be
used inside garnet to implement any routing algorithm. A custom routing
algorithm can be selected from the command line by setting
–routing-algorithm=2. See configs/network/Network.py and
src/mem/ruby/network/garnet2.0/GarnetNetwork.py</p>

<h2 id="flow-control-and-router-microarchitecture">Flow-Control and Router Microarchitecture</h2>

<p>Ruby supports two network models, Simple and Garnet, which trade-off
detailed modeling versus simulation speed respectively.</p>

<h3 id="simple-network">Simple Network</h3>

<p>The default network model in Ruby is the simple network.</p>

<ul>
  <li><strong>Related Files</strong>:
    <ul>
      <li><strong>src/mem/ruby/network/Network.py</strong></li>
      <li><strong>src/mem/ruby/network/simple</strong></li>
      <li><strong>src/mem/ruby/network/simple/SimpleNetwork.py</strong></li>
    </ul>
  </li>
</ul>

<h2 id="configuration">Configuration</h2>

<p>Simple network uses the generic network parameters in Network.py:</p>

<ul>
  <li><strong>number_of_virtual_networks</strong>: This is the maximum number of
    virtual networks. The actual number of active virtual networks
    is determined by the protocol.</li>
  <li><strong>control_msg_size</strong>: The size of control messages in bytes.
    Default is 8. <strong>m_data_msg_size</strong> in Network.cc is set to the
    block size in bytes + control_msg_size.</li>
</ul>

<p>Additional parameters are specified in simple/SimpleNetwork.py:</p>

<ul>
  <li><strong>buffer_size</strong>: Size of buffers at each switch input and
output ports. A value of 0 implies infinite buffering.</li>
  <li><strong>endpoint_bandwidth</strong>: Bandwidth at the end points of the
network in 1000th of byte.</li>
  <li><strong>adaptive_routing</strong>: This enables adaptive routing based on
occupancy of output buffers.</li>
</ul>

<h2 id="switch-model">Switch Model</h2>

<p>The simple network models hop-by-hop network traversal, but abstracts
out detailed modeling within the switches. The switches are modeled in
simple/PerfectSwitch.cc while the links are modeled in
simple/Throttle.cc. The flow-control is implemented by monitoring the
available buffers and available bandwidth in output links before
sending.</p>

<p><img src="/assets/img/Simple_network.jpg" alt="Simple_network.jpg" title="Simple_network.jpg" /></p>

<h3 id="garnet20">Garnet2.0</h3>

<p>Details of the new (2016) Garnet2.0 network are
<strong><a href="garnet-2">here</a></strong>.</p>

<h2 id="running-the-network-with-synthetic-traffic">Running the Network with Synthetic Traffic</h2>

<p>The interconnection networks can be run in a standalone manner and fed
with synthetic traffic. We recommend doing this with garnet2.0.</p>

<p><strong><a href="/documentation/general_docs/ruby/garnet_synthetic_traffic">Running Garnet Standalone with Synthetic Traffic</a></strong></p>

  <br>

  <!-- RETRIVE PREVIOUS PAGE LINK -->
  
    
  
    
  
    
  
    
  

  <!-- RETRIEVE NEXT PAGE LINK -->
  
    
  
    
  
    
  
    
  


  <div class="navbuttons">
    
      <a href=""><button type="button" class="btn btn-outline-primary">PREVIOUS</button></a>
    

    
      <a href=""><button type="button" class="btn btn-outline-primary">NEXT</button></a>
    
  </div>
</div>

	</main>
	<footer class="page-footer">
	<div class="container">
		<div class="row">

			<div class="col-12 col-sm-4">
				<p>gem5</p>
				<p><a href="/about">About</a></p>
				<p><a href="/publications">Publications</a></p>
				<p><a href="/contributing">Contributing</a></p>
				<p><a href="/governance">Governance</a></p>
			<br></div>

			<div class="col-12 col-sm-4">
				<p>Docs</p>
				<p><a href="/documentation">Documentation</a></p>
				<p><a href="http://gem5.org/Documentation">Old Documentation</a></p>
				<p><a href="https://gem5.googlesource.com/public/gem5">Source</a></p>
			<br></div>

			<div class="col-12 col-sm-4">
				<p>Help</p>
				<p><a href="/search">Search</a></p>
				<p><a href="/mailing_lists">Mailing Lists</a></p>
				<p><a href="https://gem5.googlesource.com/public/gem5-website/+/refs/heads/master/README.md">Website Source</a></p>
			<br></div>

		</div>
	</div>
</footer>


	<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
	<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js" integrity="sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49" crossorigin="anonymous"></script>
	<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js" integrity="sha384-ChfqqxuZUCnJSK3+MXmPNIyE6ZbWh2IMqE241rYiqJxyMiZ6OW/JmZQ5stwEULTy" crossorigin="anonymous"></script>
	<script src="https://unpkg.com/commentbox.io/dist/commentBox.min.js"></script>

	<script>
	  // When the user scrolls down 20px from the top of the document, show the button
	  window.onscroll = function() {scrollFunction()};

	  function scrollFunction() {
	      if (document.body.scrollTop > 100 || document.documentElement.scrollTop > 20) {
	          document.getElementById("myBtn").style.display = "block";
	      } else {
	          document.getElementById("myBtn").style.display = "none";
	      }
	  }

	  // When the user clicks on the button, scroll to the top of the document
	  function topFunction() {
	      document.body.scrollTop = 0;
	      document.documentElement.scrollTop = 0;
	  }

		import commentBox from 'commentbox.io';
		// or
		const commentBox = require('commentbox.io');
		// or if using the CDN, it will be available as a global "commentBox" variable.

		commentBox('my-project-id');

	</script>

</body>


</html>
